package com.zhiyou.shiro;

import com.zhiyou.entity.User;
import com.zhiyou.service.UserService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import sun.security.provider.MD5;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: lee
 * @Date: 2021/10/19 10:17
 */
public class ShiroRealm extends AuthenticatingRealm {

    @Autowired
    UserService userService;

    // 认证 登录会被调用的方法
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println(" =========shiro   realm============ " );
        System.out.println("authenticationToken = " + authenticationToken);
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;
        if(usernamePasswordToken.getUsername()==null || "".equals(usernamePasswordToken.getUsername())){
            return null;
        }
        String username = usernamePasswordToken.getUsername();
        User user = userService.login(username);
        // 以下信息是从数据库中获取的
        // 1） principle：认证的实体信息，可以是username，也可以是数据表对应的用户的实体类对象
        Object principle = username;
        // 2）credentials：密码
        Object credentials = user.getuUsername();
        System.out.println(credentials);
        // 3）realmName：当前realm 对象的 name，调用父类的getName()方法即可
        String realmName = getName();
        // 4）盐值
        ByteSource salt = ByteSource.Util.bytes(username);
        return new SimpleAuthenticationInfo(username, credentials,salt,realmName);
    }

//    //授权 获取权限的时候会调用此方法
//    @Override
//    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

//        System.out.println("授权");
//        //根据当前用户获取此用户的角色（权限） 从数据库查询
//        //loginName就是用户名
//        String loginName = (String) principalCollection.getPrimaryPrincipal();
//        //查询数据库 获取所有角色  查数据库（根据用户名查出用户的角色）
//        //把查询到的角色封装到AuthorizationInfo中 shiro会自动匹配角色
//        User user = userService.login(loginName);
//        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//        Collection<String> roles = new ArrayList<>(); //roles里放的是数据库中查出来当前用户对应的角色，一个人可以有多个角色
//        //封装到AuthorizationInfo中
//        roles.add("student");
//        roles.add("teacher");
//        info.addRoles(roles);
//
//
//        //查找当前用户的权限
//        Collection<String> perms = new ArrayList<>();
//        perms.add("add"); //给用户添加权限
//        perms.add("delete");
//        info.addStringPermissions(perms);
//        return info;
//    }
}
